'''
经过优化的面部追踪程序

在原例程基础上，改摄像头获取画面为彩色QVGA。
另创建灰度QQVGA用于识别追踪面部，以保障系统运行速度。

bilibili@程欢欢的智能控制集
20230826
'''
import sensor, time, image

# 初始化图像传感器
sensor.reset()

# 配置图像传感器的参数
sensor.set_contrast(3)          # 设置对比度
sensor.set_gainceiling(16)      # 设置增益上限
sensor.set_framesize(sensor.QVGA)  # 设置帧大小为QVGA（320x240）
sensor.set_pixformat(sensor.RGB565)  # 设置像素格式为RGB565

# 加载Haar级联分类器用于人脸检测
face_cascade = image.HaarCascade("frontalface", stages=25)
print(face_cascade)

# 初始化时钟，用于测量帧率（fps）
clock = time.clock()

# 为缩小的灰度图像分配额外的帧缓存
img_small = sensor.alloc_extra_fb(160, 120, sensor.GRAYSCALE)

# 主循环
fps = 0
while True:
    clock.tick()  # 更新时钟

    # 捕获一帧全尺寸的彩色图像
    img = sensor.snapshot()

    # 创建一个更小的灰度图像（QQVGA，即160x120）
    img_small.draw_image(img, 0, 0, x_size=160, y_size=120)

    # 在较小的图像上运行人脸检测
    objects = img_small.find_features(face_cascade, threshold=0.75, scale_factor=1.25)

    # 在原始图像上画出检测到的人脸的矩形框
    for r in objects:
        # 将矩形框的坐标放大到原图尺寸
        scaled_rect = [v * 2 for v in r]
        img.draw_rectangle(scaled_rect)
        print('面部：' + str(scaled_rect))

    # 在图像上显示FPS
    img.draw_string(10,10,'FPS:'+str(round(fps)), scale=2, color=(255,0,0))
    # 打印当前帧率
    fps = clock.fps()

